我正在使用Keras做一些实验,我只是监控一个简单的mlp模型的重量更新:
# model contains one input layer in the format of dense, # one hidden layer and one output layer. model=mlp() weight_origin=model.layers[0].get_weights()[0] model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(.....) # with adam optimizer weight_updated=model.layers[0].get_weights()[0] print weight_origin-weight_updated
对于第一个密集层,我得到了一个零矩阵.我认为训练不会改变这个重量.但是,其他层的权重会发生变化.所以我很困惑,为什么第一层没有变化?我检查了源代码,但仍然没有回答,然后我尝试监控:
model.layers[0].get_weights()[1] # get_weight() returns a list of weights
这一次,权重确实发生了变化.所以我想知道哪种重量是在训练期间起作用的"真实"重量?为什么重量列表中有两个元素?
定义mlp()
:
def mlp(): model=Sequential() model.add(Dense(500, input_dim=784)) model.add(Dense(503,init='normal',activation='relu')) model.add(Dense(503,init='normal',activation='relu')) model.add(Dense(10, activation='softmax')) return model
Ludwig Zhou.. 7
对于以下问题layer.get_weights()
:
我对这个问题进行了一些测试并检查了源代码.我发现该Dense
层是它的一个子类Layer
及其权重,它是一种python,它list
有两个元素权重存储在,layer.get_weights()[0]
并bias
存储在layer.get_weights()[1]
.
有一点需要注意,bias
在定义图层时可以禁用:.在这种情况下,列表只有一个元素.如果在定义属性之后将其设置为,则仍然会有一个元素,并且在您拟合模型后将更新该元素.model.add(Dense(503,init='normal',activation='relu',
bias=False
))
layer.get_weights()
bias
False
bias
对于不更新的问题:
我设置了一个只有一个密集层的Sequential模型:
def mlp_2():
model=Sequential()
model.add(Dense(10, input_dim=784, activation='softmax', bias =False))
return model
然后我用上面相同的方法编译和拟合它.这就是我得到的:
它仍然似乎没有更新重量,但是,我们可以告诉重量肯定会改变.因为准确性在增加.我认为唯一的解释是第一dense
层(你定义的input_dim
)的更新对于Keras打印输出来说太小了.我没有检查权重的更精确的值,如果有人可以确定它,那将是很好的.
对于以下问题layer.get_weights()
:
我对这个问题进行了一些测试并检查了源代码.我发现该Dense
层是它的一个子类Layer
及其权重,它是一种python,它list
有两个元素权重存储在,layer.get_weights()[0]
并bias
存储在layer.get_weights()[1]
.
有一点需要注意,bias
在定义图层时可以禁用:.在这种情况下,列表只有一个元素.如果在定义属性之后将其设置为,则仍然会有一个元素,并且在您拟合模型后将更新该元素.model.add(Dense(503,init='normal',activation='relu',
bias=False
))
layer.get_weights()
bias
False
bias
对于不更新的问题:
我设置了一个只有一个密集层的Sequential模型:
def mlp_2():
model=Sequential()
model.add(Dense(10, input_dim=784, activation='softmax', bias =False))
return model
然后我用上面相同的方法编译和拟合它.这就是我得到的:
它仍然似乎没有更新重量,但是,我们可以告诉重量肯定会改变.因为准确性在增加.我认为唯一的解释是第一dense
层(你定义的input_dim
)的更新对于Keras打印输出来说太小了.我没有检查权重的更精确的值,如果有人可以确定它,那将是很好的.